// 托盘图标2. 使用 xc.XTrayIcon_ 系列函数来操作.
package main

import (
	"fmt"
	app "gitee.com/go_888/xcgui/xcgui/app"
	wapi "gitee.com/go_888/xcgui/xcgui/wapi"
	wnd "gitee.com/go_888/xcgui/xcgui/wapi/wnd"
	wutil "gitee.com/go_888/xcgui/xcgui/wapi/wutil"
	widget "gitee.com/go_888/xcgui/xcgui/widget"
	window "gitee.com/go_888/xcgui/xcgui/window"
	xc "gitee.com/go_888/xcgui/xcgui/xc"
	xcc "gitee.com/go_888/xcgui/xcgui/xcc"
	"math/rand"
	"strconv"
	"syscall"
	"time"
)

func main() {
	rand.Seed(time.Now().Unix())
	// 1.初始化UI库
	a := app.X创建(true)
	defer a.X退出()
	a.X启用DPI(true)
	a.X启用自动DPI(true)

	// 2.创建窗口
	w := window.X创建窗口(0, 0, 430, 300, "TrayIcon2", 0, xcc.X窗口样式_默认样式|xcc.X窗口样式_拖动窗口)
	// 窗口设置边框大小
	w.X设置边大小(1, 30, 1, 1)

	// 窗口启用布局
	w.X启用布局(true)
	// 窗口设置左右两边的内填充大小
	w.X设置布局内填充大小(10, 0, 10, 0)
	// 窗口设置布局盒子垂直居中
	w.X设置垂直对齐(xcc.X布局对齐_居中)
	// 窗口设置内部元素间距
	w.X设置间距(8)
	// 窗口设置内部元素行间距
	w.X设置行距(20)

	// 创建并显示
	btnAdd := widget.X创建按钮(0, 0, 80, 30, "创建并显示", w.X句柄)
	// 显示或隐藏
	btnShow := widget.X创建按钮(0, 0, 80, 30, "隐藏", w.X句柄)
	btnShow.X启用(false)
	// 重置
	btnReset := widget.X创建按钮(0, 0, 80, 30, "重置", w.X句柄)
	btnReset.X启用(false)
	// 置焦点
	btnFocus := widget.X创建按钮(0, 0, 80, 30, "置焦点", w.X句柄)
	btnFocus.X启用(false)

	// 修改图标和提示信息
	btnMod := widget.X创建按钮(0, 0, 160, 30, "修改图标和提示信息", w.X句柄)
	btnMod.X启用(false)
	// 设置弹出气泡消息
	btnMsg := widget.X创建按钮(0, 0, 160, 30, "设置弹出气泡消息", w.X句柄)
	btnMsg.X启用(false)

	// 加载图标
	hIcon1 := wutil.X加载icon图标("TrayIcon2/icon1.ico")
	fmt.Println("hIcon1:", hIcon1, "LastErr:", syscall.GetLastError())
	hIcon2 := wutil.X加载icon图标("TrayIcon2/icon2.ico")
	fmt.Println("hIcon2:", hIcon2, "LastErr:", syscall.GetLastError())

	// 创建并显示托盘图标
	btnAdd.X事件_被单击(func(pbHandled *bool) int {
		btnAdd.X启用(false).X重绘(false)

		// 托盘图标_置图标
		xc.X托盘图标_设置图标(hIcon1)
		// 托盘图标_置提示文本
		xc.X托盘图标_设置提示文本("托盘提示信息")
		// 添加
		xc.X托盘图标_添加(w.X句柄, 111) // 自定义的托盘图标唯一标识符会传到托盘事件的第一个参数里

		w.X设置属性("记录当前托盘图标", "1")
		btnMod.X启用(true).X重绘(false)
		btnShow.X启用(true).X重绘(false)
		btnMsg.X启用(true).X重绘(false)
		btnFocus.X启用(true).X重绘(false)
		return 0
	})

	// 设置弹出气泡消息
	btnMsg.X事件_被单击(func(pbHandled *bool) int {
		btnMsg.X启用(false).X重绘(false)
		defer btnMsg.X启用(true).X重绘(false)

		xc.X托盘图标_设置弹出气泡("弹出气泡标题", "弹出气泡内容: "+strconv.Itoa(rand.Int()), 0, xcc.X托盘图标标识_信息图标)
		xc.X托盘图标_修改()
		return 0
	})

	// 修改
	btnMod.X事件_被单击(func(pbHandled *bool) int {
		btnMod.X启用(false).X重绘(false)
		defer btnMod.X启用(true).X重绘(false)

		// 修改为新的图标
		if w.X取属性("记录当前托盘图标") == "1" {
			xc.X托盘图标_设置图标(hIcon2)
			w.X设置属性("记录当前托盘图标", "2")
		} else {
			xc.X托盘图标_设置图标(hIcon1)
			w.X设置属性("记录当前托盘图标", "1")
		}

		// 修改托盘提示信息
		xc.X托盘图标_设置提示文本("修改了图标和托盘提示信息: " + strconv.Itoa(rand.Int()))

		// 应用修改
		xc.X托盘图标_修改()
		return 0
	})

	// 显示或隐藏
	btnShow.X事件_被单击(func(pbHandled *bool) int {
		btnShow.X启用(false).X重绘(false)

		if btnShow.X取文本() == "显示" {
			btnShow.X设置文本("隐藏")
			xc.X托盘图标_添加(w.X句柄, 111)
		} else {
			btnShow.X设置文本("显示")
			xc.X托盘图标_删除()
		}

		btnReset.X启用(!btnReset.X是否启用()).X重绘(false)
		btnShow.X启用(true).X重绘(false)
		return 0
	})

	// 重置会清空已经设置的图标(图标句柄并没有释放)、文字提示等信息, 只能在托盘图标不在系统托盘显示的时候使用
	btnReset.X事件_被单击(func(pbHandled *bool) int {
		btnReset.X启用(false).X重绘(false)
		defer btnReset.X启用(true).X重绘(false)

		xc.X托盘图标_重置()
		return 0
	})

	// 托盘图标置焦点
	btnFocus.X事件_被单击(func(pbHandled *bool) int {
		btnFocus.X启用(false).X重绘(false)
		defer btnFocus.X启用(true).X重绘(false)

		xc.X托盘图标_设置焦点()
		return 0
	})

	// 注册托盘图标事件
	w.X事件_托盘图标(func(wParam, lParam uintptr, pbHandled *bool) int {
		fmt.Println(wParam, lParam)
		if wParam != 111 { // 不是自定义的托盘图标唯一标识符.
			return 0
		}

		switch xcc.X窗口事件(lParam) {
		case xcc.X窗口事件_鼠标_左键按下:
			w.X显示方式(xcc.X窗口显示方式_正常显示)
		case xcc.X窗口事件_鼠标_右键按下:
			// 创建菜单
			menu := widget.X创建菜单()
			// 一级菜单
			menu.X添加项(10001, "窗口置顶", 0, xcc.X菜单项标识_选择)
			// 获取自己 SetProperty 的值, 这不是读写元素的属性, 可理解为对元素里内置的一个map进行读写
			// 这样可以不用另外声明变量, 能用到很多地方记录一些东西
			if w.X取属性("记录窗口置顶状态") == "1" {
				menu.X设置项勾选(10001, true)
			} else {
				menu.X设置项勾选(10001, false)
			}

			menu.X添加项(99999, "退出", 0, xcc.X菜单项标识_正常)

			// 获取鼠标光标的屏幕坐标
			var pt wapi.X坐标
			wapi.X取鼠标光标位置(&pt)
			// 弹出菜单
			menu.X弹出(w.X取HWND句柄(), pt.X+10, pt.Y-30, 0, xcc.X菜单弹出方向_左上角)
		}
		return 0
	})

	// 菜单被选择事件
	w.X事件_菜单选择(func(nID int32, pbHandled *bool) int {
		fmt.Println("托盘菜单被选择:", nID)
		switch nID {
		case 10001:
			if w.X取属性("记录窗口置顶状态") == "1" {
				w.X设置属性("记录窗口置顶状态", "0")
				wnd.X窗口置顶(w.X取HWND句柄(), false)
				fmt.Println("窗口已取消置顶")
			} else {
				w.X设置属性("记录窗口置顶状态", "1")
				wnd.X窗口置顶(w.X取HWND句柄(), true)
				fmt.Println("窗口已被置顶")
			}
		case 99999:
			w.X关闭()
			a.X发送退出消息(0)
		}
		return 0
	})

	// 3.显示窗口
	w.X显示(true)
	a.X运行()
}
